# ================================
# 0) Setup
# ================================
required_pkgs <- c("tidyverse","dplyr","ggplot2","forcats","scales","stringr","ggridges")
to_install <- setdiff(required_pkgs, rownames(installed.packages()))
if (length(to_install)) install.packages(to_install, quiet = TRUE)
invisible(lapply(required_pkgs, library, character.only = TRUE))

# (opcional) reprodutibilidade de amostragens, se usar
set.seed(123)

# ================================
# 1) Coleta (ou carregamento) dos dados
# ================================
# Se você tem as funções de coleta:
# source("coletar_producao_legislativa.R")
# df_senadores_legislatura <- obter_dados_senadores_legislatura(47, 56)
# ids <- df_senadores_legislatura$IdentificacaoParlamentar.CodigoParlamentar
# dados <- coletar_producao_legislativa(ids)

# Fallback: usa objeto já existente no ambiente
if (!exists("dados")) {
  if (exists("requerimentos_por_autor")) {
    dados <- requerimentos_por_autor
  } else {
    stop("Nenhum objeto de dados encontrado. Forneça `dados` ou `requerimentos_por_autor`.")
  }
}

# ================================
# 2) Filtragem temporal + deduplicação
# ================================
dados_filtrados <- dados %>%
  mutate(dataApresentacao = as.Date(dataApresentacao)) %>%
  filter(dataApresentacao >= as.Date("1985-01-01"),
         dataApresentacao <= as.Date("2025-12-31")) %>%
  distinct(id, .keep_all = TRUE)

# Garante colunas essenciais
needed_cols <- c("id","tipoConteudo","ano","autoria","tipoDocumento",
                 "casaIdentificadora","enteIdentificador","governo")
missing_cols <- setdiff(needed_cols, names(dados_filtrados))
if (length(missing_cols)) {
  warning("Colunas ausentes: ", paste(missing_cols, collapse = ", "))
}

# ================================
# 3) Agregação substantiva (tipoConteudo -> tipoConteudo_agregado)
# ================================
dados_filtrados <- dados_filtrados %>%
  mutate(
    tipoConteudo_agregado = case_when(
      # --- CONTROLE PROCESSUAL ---
      tipoConteudo %in% c(
        "Urgência para matéria","Desarquivamento de matéria","Destaque para votação em separado",
        "Extinção de urgência","Tramitação conjunta","Inclusão de matéria na Ordem do Dia",
        "Preferência","Inversão da Ordem do Dia","Recurso em razão de decisão de Comissão sobre proposição em caráter terminativo",
        "Retirada de matéria","Adiamento de apreciação de matéria","Aditamento de requerimento",
        "Calendário especial","Desapensamento de matérias","Retirada de emenda","Retirada de matéria da Ordem do Dia",
        "Encerramento de discussão","Destaque para constituição de proposição autônoma",
        "Votação em globo","Votação nominal","Retirada de assinatura de matéria","Dispensa de parecer"
      ) ~ "Controle Processual",
      
      # --- CONTROLE POR AUDIÊNCIA ---
      tipoConteudo %in% c(
        "Audiência Pública","Realização de diligência","Avaliação de Políticas Públicas",
        "Realização de sessão de debates temáticos","Audiência de outra comissão",
        "Convite a autoridades","Convocação de autoridades",
        "Convite a cidadão ou autoridade não arrolada no art. 50, caput da Constituição Federal"
      ) ~ "Controle por Audiência",
      
      # --- NOMEAÇÕES E APROVAÇÕES ---
      tipoConteudo %in% c(
        "Indicação nos termos do art. 224 do RISF","Escolha de membro do TCU",
        "Indicação de membros","Confirmação de assinatura de proposição legislativa",
        "Indicação de membro do Conselho Nacional de Justiça","Indicação de membro de Conselho Nacional do Ministério Público",
        "Indicação de Diretor da Instituição Fiscal Independente","Indicação de Autoridade"
      ) ~ "Nomeações e Aprovações",
      
      # --- PRODUÇÃO NORMATIVA ---
      tipoConteudo %in% c(
        "Norma Geral","Norma Jurídica","Norma Jurídica - não categorizada",
        "Regimento Interno do Senado Federal e Normas Conexas","Conteúdo Legislativo não categorizado",
        "Convocação de referendo ou plebiscito","Veto Constitucional",
        "Conteúdo Legislativo de natureza específica não categorizado",
        "Conteúdo Legislativo de proposta processual regimental - não categorizado",
        "Conteúdo Legislativo deliberável não categorizado",
        "Conteúdo Legislativo proveniente de atribuição direta da Constituição Federal - não categorizado"
      ) ~ "Produção Normativa",
      
      # --- CONTROLE ORÇAMENTÁRIO ---
      tipoConteudo %in% c(
        "Autorização de operações financeiras","Fixação de alíquotas de impostos",
        "Fixação de subsídios","Limites e condições para endividamento",
        "Limites e condições para endividamento e operações de crédito externo e interno e concessão de garantia da União"
      ) ~ "Controle Orçamentário",
      
      # --- CONTROLE SIMBÓLICO ---
      tipoConteudo %in% c(
        "Congratulações, pesar, censura e assemelhados","Sessão solene",
        "Voto de aplauso, solidariedade ou semelhante","Homenagem de pesar",
        "Voto de censura ou semelhante","Homenagens, diplomas, condecorações, premiações e comemorações",
        "Realização de sessão especial ou comemoração no período do expediente",
        "Publicação de documentos no Diário do Senado Federal, para transcrição nos Anais",
        "Diplomas, condecorações e premiações","Representação em solenidade internacional, nacional ou regional"
      ) ~ "Controle Simbólico",
      
      # --- MISSÕES E REPRESENTAÇÕES ---
      tipoConteudo %in% c(
        "Missão da Casa no país ou no exterior","Missão política ou cultural de interesse parlamentar",
        "Missão (em representação do Senado Federal)","Missão (em representação do Senado Federal)  com ônus para o Senado",
        "Missão (em representação do Senado Federal) sem ônus para o Senado"
      ) ~ "Missões e Representações",
      
      # --- LICENÇAS ---
      tipoConteudo %in% c(
        "Licença Saúde","Licença Interesse Particular","Licença Saúde (até a 120 dias)",
        "Licença Saúde (superior a 120 dias)","Licença Interesse Particular (até a 120 dias)",
        "Licença Interesse Particular (superior a 120 dias)",
        "Licença Saúde combinada com licença para tratar de interesse particular (superior a 120 dias)",
        "Licença adotante","Licença gestante","Licença Nojo","Licença para casamento"
      ) ~ "Licenças Parlamentares",
      
      # --- CRIAÇÃO INSTITUCIONAL ---
      tipoConteudo %in% c(
        "Criação ou alteração de comissão parlamentar de inquérito","Criação ou alteração de subcomissão",
        "Criação ou alteração de grupo de trabalho","Regimento Comum do Congresso Nacional e Normas Conexas",
        "Prorrogação de comissão parlamentar de inquérito","Criação ou alteração de comissão temporária",
        "Grupos e frentes parlamentares","Criação de comissão permanente","Prorrogação de comissão temporária"
      ) ~ "Criação Institucional",
      
      # --- CONTROLE INFORMACIONAL ---
      tipoConteudo %in% c(
        "Informações","Conteúdo Informacional não categorizado","Solicitação de esclarecimentos/Informações",
        "Relatório, recomendação, documentação","Conteúdo informacional de ato normativo - não categorizado",
        "Conteúdo informacional de ato administrativo - não categorizado"
      ) ~ "Controle Informacional",
      
      # --- OBSTRUÇÃO ---
      tipoConteudo %in% c(
        "Sustação de ato do Poder Executivo","Impugnação de dispositivo estranho à Medida Provisória",
        "Suspensão de execução de lei inconstitucional","Impugnação de proposição pelo Presidente",
        "Sobrestamento"
      ) ~ "Obstrução Institucional",
      
      # --- FISCALIZAÇÃO TÉCNICA ---
      tipoConteudo %in% c(
        "Auditoria","Fiscalização de Obras e Serviços","Proposta de Fiscalização e Controle"
      ) ~ "Fiscalização Técnica",
      
      # --- ATOS ADMINISTRATIVOS ---
      tipoConteudo %in% c(
        "Funcionamento do Senado Federal","Regulamentação Interna ao Poder legislativo",
        "Suspensão de prazo de comissão","Comunicação Legislativa Interna","Comunicação Legislativa Externa - não categorizada",
        "Comunicação de composição e/ou calendário de Comissão Mista","Reconstituição de processo de proposição extraviada",
        "Inclusão em Coleções do Senado Federal","Não realização de sessão"
      ) ~ "Atos Administrativos",
      
      # --- RECURSOS/REVISÕES ---
      tipoConteudo %in% c(
        "Recurso em razão de decisão de Comissão pela rejeição, quanto ao mérito de proposição, em caráter não terminativo",
        "Recurso regimental - não categorizado","Recurso em razão de decisão da Mesa sobre Questão de Ordem",
        "Questão de ordem","Encaminha recurso a questão de ordem","Reexame de matéria por Comissão",
        "Apoiamento regimental a proposições","Petição (não categorizada)",
        "Recurso em razão de decisão da CCJ pela inconstitucionalidade e injuridicidade de proposição"
      ) ~ "Recursos e Revisões",
      
      TRUE ~ "Diversos / Não Categorizado"
    )
  )

# ================================
# 4) Mapeamento para 'oversight_dimension' e 'conceptual_stage'
# ================================
dados_filtrados <- dados_filtrados %>%
  mutate(
    oversight_dimension = case_when(
      tipoConteudo_agregado == "Controle Processual"        ~ "Procedural Calibration",
      tipoConteudo_agregado == "Controle por Audiência"     ~ "Strategic Activation (Request)",
      tipoConteudo_agregado == "Nomeações e Aprovações"     ~ "Symbolic Performance",
      tipoConteudo_agregado == "Produção Normativa"         ~ "Strategic Activation (Execution)",
      tipoConteudo_agregado == "Controle Orçamentário"      ~ "Strategic Activation (Execution)",
      tipoConteudo_agregado == "Controle Simbólico"         ~ "Symbolic Performance",
      tipoConteudo_agregado == "Missões e Representações"   ~ "Symbolic Performance",
      tipoConteudo_agregado == "Licenças Parlamentares"     ~ "Symbolic Performance",
      tipoConteudo_agregado == "Criação Institucional"      ~ "Strategic Activation (Execution)",
      tipoConteudo_agregado == "Controle Informacional"     ~ "Latent Monitoring",
      tipoConteudo_agregado == "Obstrução Institucional"    ~ "Institutional Obstruction",
      tipoConteudo_agregado == "Fiscalização Técnica"       ~ "Latent Monitoring",
      tipoConteudo_agregado == "Atos Administrativos"       ~ "Latent Monitoring",
      tipoConteudo_agregado == "Recursos e Revisões"        ~ "Procedural Calibration",
      TRUE ~ "Other"
    ),
    conceptual_stage = case_when(
      oversight_dimension %in% c("Latent Monitoring","Procedural Calibration") ~ "Strategic Latency",
      oversight_dimension %in% c("Symbolic Performance","Strategic Activation (Request)") ~ "Salience Activation",
      oversight_dimension %in% c("Strategic Activation (Execution)","Institutional Obstruction") ~ "Visible Control",
      TRUE ~ "Other"
    )
  )

# Ordena níveis (para gráficos e tabelas)
dados_filtrados$oversight_dimension <- factor(
  dados_filtrados$oversight_dimension,
  levels = c("Latent Monitoring","Procedural Calibration","Symbolic Performance",
             "Strategic Activation (Request)","Strategic Activation (Execution)","Institutional Obstruction","Other")
)

dados_filtrados$conceptual_stage <- factor(
  dados_filtrados$conceptual_stage,
  levels = c("Strategic Latency","Salience Activation","Visible Control","Other")
)

write_csv2(dados_filtrados, "dados/dados_filtrados.csv")

# ================================
# 5) Estatísticas descritivas
# ================================
tabela4 <- dados_filtrados %>%
  filter(oversight_dimension != "Other") %>%
  count(conceptual_stage, oversight_dimension, name = "freq") %>%
  mutate(prop = freq / sum(freq))

print(tabela4)
# Se quiser formato %:
tabela4_pct <- tabela4 %>% mutate(prop = scales::percent(prop))
print(tabela4_pct)

# ================================
# 6) Paletas e faixas de contexto (para gráficos)
# ================================
dim_colors <- c(
  "Latent Monitoring"               = "#fddbc7",
  "Procedural Calibration"          = "#f4a582",
  "Symbolic Performance"            = "#92c5de",
  "Strategic Activation (Request)"  = "#4393c3",
  "Strategic Activation (Execution)"= "#2166ac",
  "Institutional Obstruction"       = "#b2182b",
  "Other"                           = "gray80"
)

faixas <- tibble(
  xmin = c(2005, 2015),
  xmax = c(2015, 2025),
  fill = c("gray90","gray80")
)

# ================================
# 7) Gráfico geral (Senado) – densidades por dimensão
# ================================
p_senado <- dados_filtrados %>%
  filter(!is.na(ano), oversight_dimension != "Other") %>%
  ggplot(aes(x = ano, y = oversight_dimension, fill = oversight_dimension)) +
  geom_rect(data = faixas,
            aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf),
            inherit.aes = FALSE, fill = faixas$fill, alpha = 0.1) +
  ggridges::geom_density_ridges(scale = 1.5, alpha = 0.85, color = "white") +
  scale_fill_manual(values = dim_colors, guide = "none") +
  labs(
    title = "Temporal Evolution of Legislative Oversight Modes (Senate)",
    subtitle = "Modes organized according to the logic of proactive calibration",
    x = "Year", y = "Oversight Mode"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "none",
    panel.grid.major.y = element_blank(),
    plot.title = element_text(face = "bold")
  )

print(p_senado)

# ================================
# 8) Subconjunto CRE e gráficos específicos
# ================================
# Filtra CRE se a coluna existir
if ("enteIdentificador" %in% names(dados_filtrados)) {
  cre_dados <- dados_filtrados %>% filter(enteIdentificador == "CRE")
} else if ("casaIdentificadora" %in% names(dados_filtrados)) {
  # Caso alternativo: se houver outra coluna que identifique a CRE, ajuste aqui
  cre_dados <- dados_filtrados %>% filter(str_detect(tolower(casaIdentificadora), "cre"))
} else {
  warning("Não foi possível isolar CRE: coluna de identificação ausente. Usando todo o Senado como proxy.")
  cre_dados <- dados_filtrados
}

# Densidades CRE
p_cre <- cre_dados %>%
  filter(!is.na(ano), oversight_dimension != "Other") %>%
  ggplot(aes(x = ano, y = oversight_dimension, fill = oversight_dimension)) +
  geom_rect(data = faixas,
            aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf),
            inherit.aes = FALSE, fill = faixas$fill, alpha = 0.1) +
  ggridges::geom_density_ridges(scale = 1.5, alpha = 0.85, color = "white") +
  scale_fill_manual(values = dim_colors, guide = "none") +
  labs(
    title = "Temporal Evolution of CRE Actions by Oversight Dimension",
    subtitle = "Organized by proactive calibration",
    x = "Year", y = "Oversight Mode"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "none",
    panel.grid.major.y = element_blank(),
    plot.title = element_text(face = "bold")
  )

print(p_cre)

# ================================
# 9) Barras dentro de cada estágio (shares por instrumento agregado)
# ================================
translation_dict <- c(
  "Licenças Parlamentares"   = "Parliamentary Leaves",
  "Atos Administrativos"     = "Administrative Acts",
  "Controle Informacional"   = "Informational Control",
  "Controle Processual"      = "Procedural Control",
  "Criação Institucional"    = "Institutional Creation",
  "Nomeações e Aprovações"   = "Appointments & Approvals",
  "Recursos e Revisões"      = "Appeals & Reviews",
  "Produção Normativa"       = "Normative Production",
  "Controle Simbólico"       = "Symbolic Control",
  "Missões e Representações" = "Missions & Delegations",
  "Controle por Audiência"   = "Hearing Control",
  "Fiscalização Técnica"     = "Technical Oversight",
  "Controle Orçamentário"    = "Budgetary Control",
  "Obstrução Institucional"  = "Institutional Obstruction"
)

cre_sum <- cre_dados %>%
  filter(oversight_dimension != "Other") %>%
  count(conceptual_stage, tipoConteudo_agregado, name = "n") %>%
  group_by(conceptual_stage) %>%
  mutate(prop = n / sum(n)) %>%
  ungroup() %>%
  mutate(tipo_en = recode(tipoConteudo_agregado, !!!translation_dict),
         tipo_wrapped = stringr::str_wrap(coalesce(tipo_en, tipoConteudo_agregado), width = 28)) %>%
  group_by(conceptual_stage) %>%
  mutate(tipo_ord = forcats::fct_reorder(tipo_wrapped, -prop)) %>%
  ungroup()

stage_fill <- c(
  "Strategic Latency"   = "#f4a582",
  "Salience Activation" = "#4393c3",
  "Visible Control"     = "#b2182b",
  "Other"               = "gray80"
)

p_barras <- ggplot(cre_sum, aes(x = prop, y = tipo_ord, fill = conceptual_stage)) +
  geom_col(width = 0.7, alpha = 0.95) +
  geom_text(aes(label = scales::percent(prop, accuracy = 1)), hjust = -0.06, size = 3.2) +
  scale_x_continuous(labels = scales::percent_format(accuracy = 1),
                     expand = expansion(mult = c(0, 0.12)), limits = c(0, 1)) +
  scale_fill_manual(values = stage_fill, guide = "none") +
  facet_wrap(~ conceptual_stage, ncol = 1, scales = "free_y") +
  labs(
    title = "CRE — Distribution of Action Types by Calibration Stage",
    subtitle = "Within-stage shares (Latency • Salience • Control)",
    x = "Within-stage share", y = NULL,
    caption = "Note: shares computed within each stage; capture 'salience as intention' (signaling), not external media uptake."
  ) +
  theme_minimal(base_size = 13) +
  theme(
    strip.text = element_text(face = "bold"),
    plot.title = element_text(face = "bold"),
    panel.grid.major.y = element_blank(),
    axis.text.y = element_text(lineheight = 0.95)
  )

print(p_barras)

# ================================
# 10) Comparação Senado x CRE (densidades lado a lado)
# ================================
senado_dados <- dados_filtrados %>% mutate(fonte = "Senate (All)")
cre_plot_dados <- cre_dados %>% mutate(fonte = "CRE")

dados_comparados <- bind_rows(senado_dados, cre_plot_dados) %>%
  filter(oversight_dimension != "Other", !is.na(ano))

p_comp <- ggplot(dados_comparados,
                 aes(x = ano, y = oversight_dimension, fill = oversight_dimension)) +
  ggridges::geom_density_ridges(scale = 1.5, alpha = 0.85, color = "white") +
  facet_wrap(~ fonte, ncol = 1, scales = "free_y") +
  scale_fill_manual(values = dim_colors, guide = "none") +
  labs(
    title = "Temporal Comparison: Full Senate vs. CRE",
    subtitle = "Distribution of actions by oversight dimension",
    x = "Year", y = "Oversight Mode"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "none",
    panel.grid.major.y = element_blank(),
    strip.text = element_text(face = "bold"),
    plot.title = element_text(face = "bold")
  )

print(p_comp)

# ================================
# Fim
# ================================
